package com.psychologyCommunity.Community.Contoller;

import com.mysql.cj.util.StringUtils;
import com.psychologyCommunity.Community.config.WkConfig;
import com.psychologyCommunity.Community.entity.Event;
import com.psychologyCommunity.Community.event.EventProducer;
import com.psychologyCommunity.Community.util.CommunityConstance;
import com.psychologyCommunity.Community.util.CommunityUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

@Controller
public class ShareController implements CommunityConstance {
    private static final Logger logger= LoggerFactory.getLogger(ShareController.class);

    //前端提供一访问这个方法，就能生成图片 -生成图片的时间比较长，一般都是异步的方式
    //一般习惯于用  事件驱动 --分享图片，Controller把事件丢给kafka，后序由kafka异步实现
    // 而不是让java在这等着，因为等着的时间长，客户端响应的比较慢，这样服务器处理的能力就比较弱

    //生产者
    @Autowired
    private EventProducer eventProducer;

    @Value("${community.path.domain}")
    private String domain;

    @Value("${server.servlet.context-path}")
    private String contextPath;

    @Value("${wk.image.storage}")
    private  String wkImageStorage;

    //请求做成异步，直接返回JSON格式就行
    //需要传参，你分享的是哪个功能，好根据功能生成对应的图片--此处做简化
    // 直接传url路径告诉 方法 需要把哪个方法 生成长图
    @RequestMapping(path = "/share",method = RequestMethod.GET)
    @ResponseBody
    public String share(String htmlUrl){
        //文件名
        String fileName= CommunityUtil.generateUUID();
        //创建一个 事件 来携带数据--包括主题和一些数据，比如说
        // 文件名在Controller指定然后 让 kafka 去按照这个名字去生成
        Event event=new Event()
                .setTopic(TOPIC_SHARE)
                .setData("htmlUrl",htmlUrl)
                .setData("fileName",fileName)
                .setData("suffix",".png");//异步生成-长图，如果当前同时分享的人特别多，此时效率也高，因为不用等着
        eventProducer.fireEvent(event);//把事件传入

        //需要给客户端返回一个 访问路径
        Map<String,Object> map=new HashMap<>();
        map.put("shareUrl",domain+contextPath+"/share/image/"+fileName);
        return  CommunityUtil.getJSONString(0,null,map);
    }
    //获取长图
    @RequestMapping(path = "/share/image/{fileName}",method = RequestMethod.GET)
    public void getShareImage(@PathVariable("fileName") String fileName, HttpServletResponse response) {
        if (StringUtils.isNullOrEmpty(fileName)){
            throw new IllegalArgumentException("文件名不能为空！！");
        }
        response.setContentType("image/png");
        File file=new File(wkImageStorage+"/"+fileName+".png");
        try {

            OutputStream os= response.getOutputStream();
            //文件的输入需要一个输入流
            FileInputStream fis=new FileInputStream(file);
            byte[] buffer=new byte[1024];
            int b=0;
            while ((b=fis.read(buffer)) !=-1){
                os.write(buffer,0,b); }
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("宝儿，生成长图失败："+ e.getMessage());
        }
    }

}
